package mornd.test$asm;

import mornd.test$asm.asm.$Proxy0Dump;

import java.io.FileOutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author: mornd
 * @dateTime: 2023/5/5 - 21:51
 * 测试 asm 如何获取代理对象，并将代理对象的 class 实例化加载到内存中
 */
public class ASMTest {
    public static void main(String[] args) throws Exception {
        byte[] dump = $Proxy0Dump.dump();

        // 输出 .class 文件到磁盘
//        FileOutputStream fileOutputStream = new FileOutputStream("$Proxy0.class");
//        fileOutputStream.write(dump, 0, dump.length);
//
//        fileOutputStream.close();


        /**
         * 动态生成对象并加入内存中
         */
        ClassLoader cl = new ClassLoader() {
            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
                return super.defineClass(name, dump, 0, dump.length);
            }
        };

        // 获取字节码对象
        Class<?> clazz = cl.loadClass("mornd.test$asm.$Proxy0");

        // 通过 class 实例化出来，并调用方法
        Constructor<?> constructor = clazz.getDeclaredConstructor(InvocationHandler.class);
        constructor.setAccessible(true);
        AAA proxy = (AAA) constructor.newInstance((InvocationHandler) (proxy1, method, args1) -> {
            System.out.println("proxy method....");
            return null;
        });

        proxy.func();
        System.out.println(proxy.getClass());
    }
}
